package com.example.testappwidget.widgetprovider

import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.widget.RemoteViews
import com.example.testappwidget.R
import com.example.testappwidget.ui.activity.MainActivity
import com.example.testappwidget.utils.LogUtil
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

/*
 *Author: chinadragon
 *Time: 2024/4/1
 *
 * https://blog.csdn.net/lwzhang1101/article/details/101429143
 */
class TestWidget : AppWidgetProvider() {
    var count = 0
    companion object{
        const val TAG = "TestWidget ---> "
        const val key_1 = "key_1"
        const val key_2 = "key_2"
    }

    //在接收到广播时，调用。
    override fun onReceive(context: Context?, intent: Intent?) {
        super.onReceive(context, intent)
        LogUtil.i(TAG, "回调 onReceive intent == null : ${intent == null}")
        if (intent == null){
            return
        }
        LogUtil.i(TAG,"回调 onReceive action : ${intent.action}")
        //当最后一个 widget 的实例被移除时触发
        //回调 onReceive action : android.appwidget.action.APPWIDGET_DISABLED


        // widget 的实例被创建时发送的
        //回调 onReceive action : android.appwidget.action.APPWIDGET_UPDATE


        //第一个 widget 的实例被创建时发送的
        //回调 onReceive action : android.appwidget.action.APPWIDGET_ENABLED

        //多个相同的小组件，从主屏幕中移除其中一个
        //回调 onReceive action : android.appwidget.action.APPWIDGET_DELETED


        intent.extras?.let {
            val key_1_value = it.getString(key_1)
            LogUtil.i(TAG, "回调 onReceive  key_1_value = ${key_1_value}")
        }


    }

    override fun onUpdate(context: Context?, appWidgetManager: AppWidgetManager?, appWidgetIds: IntArray?) {
        super.onUpdate(context, appWidgetManager, appWidgetIds)
        LogUtil.i(TAG, "回调 onUpdate context == null : ${context == null}")
        appWidgetIds?.let {
            LogUtil.i(TAG, "回调 onUpdate appWidgetIds.size = ${it.size}")
            for ((index, item) in it.withIndex()){
                LogUtil.i(TAG,"回调 onUpdate appWidgetIds：${item}")
            }
//
//            it.map {item ->
//                LogUtil.i(TAG,"回调 onUpdate appWidgetIds：${item}")
//            }
        }

        if (context == null){
            return
        }


//            val views = RemoteViews(context.packageName, R.layout.test_appwidget)
//            views.setTextViewText(R.id.tv, "更新数据${count++}")
//
//            //为AppWidget设置点击事件的响应，启动显示电池信息详情的activity
//            val startActivityIntent = Intent(context, MainActivity::class.java)
//            val pendingIntent = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R){
//                PendingIntent.getActivity(context,0,startActivityIntent,PendingIntent.FLAG_UPDATE_CURRENT)
//            }else{
//                PendingIntent.getActivity(context,0,startActivityIntent,PendingIntent.FLAG_IMMUTABLE)
//            }
//            views.setOnClickPendingIntent(R.id.imageView,pendingIntent)
//
//            appWidgetManager?.updateAppWidget(appWidgetIds, views)

        val scope = CoroutineScope(Dispatchers.Default)
        scope.launch {
            // 在后台线程中执行网络请求
//            val result = makeNetworkRequest()
            withContext(Dispatchers.Main){

                val views = RemoteViews(context.packageName, R.layout.test_appwidget)
                views.setTextViewText(R.id.tv, "AppWidgetProvider更新数据${count++}")

                //为AppWidget设置点击事件的响应，启动显示电池信息详情的activity
                val startActivityIntent = Intent(context, MainActivity::class.java)
                val pendingIntent = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R){
                    PendingIntent.getActivity(context,0,startActivityIntent,PendingIntent.FLAG_UPDATE_CURRENT)
                }else{
                    PendingIntent.getActivity(context,0,startActivityIntent,PendingIntent.FLAG_IMMUTABLE)
                }
                views.setOnClickPendingIntent(R.id.imageView,pendingIntent)

                appWidgetManager?.updateAppWidget(appWidgetIds, views)
            }
        }

    }

    //当 Widget 的尺寸或其他选项发生变化时调用该方法。你可以在这里根据新的尺寸或选项重新布局和更新 Widget。
    override fun onAppWidgetOptionsChanged(context: Context?, appWidgetManager: AppWidgetManager?, appWidgetId: Int, newOptions: Bundle?) {
        super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions)
        LogUtil.i(TAG, "回调 onAppWidgetOptionsChanged")

    }

    //当 widget 被删除时被触发。
    override fun onDeleted(context: Context?, appWidgetIds: IntArray?) {
        super.onDeleted(context, appWidgetIds)
        LogUtil.i(TAG, "回调 onDeleted")

    }

    //当第一个 widget 的实例被创建时触发。也就是说，如果用户对同一个 widget 增加了两次（两个实例），那么onEnabled()只会在第一次增加widget时触发。
    //当第一个 Widget 实例被添加到屏幕上时调用该方法。你可以在这里执行一些初始化操作，如启动后台服务或设置定期更新。
    override fun onEnabled(context: Context?) {
        super.onEnabled(context)
        LogUtil.i(TAG, "回调 onEnabled")

    }

    //当最后一个 widget 的实例被删除时触发。
    // 当最后一个 Widget 实例从屏幕上移除时调用该方法。你可以在这里进行一些清理操作，如停止后台服务或清除定期更新。
    override fun onDisabled(context: Context?) {
        super.onDisabled(context)
        LogUtil.i(TAG, "回调 onDisabled")

    }

    // 当 Widget 从备份或恢复中重新创建时调用该方法。你可以在这里进行特定的恢复操作，例如重新加载之前保存的数据。
    override fun onRestored(context: Context?, oldWidgetIds: IntArray?, newWidgetIds: IntArray?) {
        super.onRestored(context, oldWidgetIds, newWidgetIds)
        LogUtil.i(TAG, "回调 onRestored")
    }
}